package pe.com.cotelasa.scp.controlador;

import com.thoughtworks.xstream.XStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.scp.controlador.backingBean.BKGuiaDeRemisionOUT;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticuloSede;
import pe.com.cotelasa.scp.dominio.service.IServicioCorrelativoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioGuiaRemision;
import pe.com.cotelasa.scp.dominio.service.IServicioMotivo;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoUnidadMinima;
import pe.com.cotelasa.scp.entidad.ArticuloSede;
import pe.com.cotelasa.scp.entidad.CorrelativoDocumento;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.Motivo;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.scp.entidad.TipoDocumento;
import pe.com.cotelasa.scp.entidad.TipoUnidadMinima;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@SuppressWarnings({"serial"})
@Named(value = "MBGuiaDeRemisionOUT")
@Scope("request")
public class MBGuiaDeRemisionOUT extends MBGuiaDeRemision {

    private static Logger logger = Logger.getLogger(MBGuiaDeRemisionOUT.class);
    @Inject
    private IServicioTipoDocumento servicioTipoDocumento;
    @Inject
    private IServicioGuiaRemision servicioGuia;
    @Inject
    private BKGuiaDeRemisionOUT bkGuiaDeRemisionOUT;
    @Inject
    private IServicioCorrelativoDocumento servicioCorrelativo;
    @Inject
    private IServicioOrdenCompraServicio servicioOCS;
    @Inject
    private IServicioParametro servicioParametro;
    @Inject
    private IServicioMotivo servicioMotivo;
    @Autowired
    BKSession session;

    @PostConstruct
    public void createObjectInject() {
        this.bkGuiaDeRemision = bkGuiaDeRemisionOUT;
    }

    public void obtenerDetalleGRemision() {

        if (bkGuiaDeRemision.getGuiaFormulario().getIdOrdenCompraServicio().getId() != 0) {
            try {
                bkGuiaDeRemision.getGuiaFormulario().setIdOrdenCompraServicio(
                        servicioOCS.conseguirOrdenCompraServicioPorId(bkGuiaDeRemision.getGuiaFormulario().getIdOrdenCompraServicio().getId()));
            } catch (ServiceException e) {
                mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
                logger.error(e.getMessage(), e);
            }
            bkGuiaDeRemision.setProveedoGuia(bkGuiaDeRemision.getGuiaFormulario().getIdOrdenCompraServicio().getIdProveedor());
        } else {
            bkGuiaDeRemision.getGuiaFormulario().setIdOrdenCompraServicio(new OrdenCompraServicio(0));
            bkGuiaDeRemision.setProveedoGuia(new Proveedor());
        }
        bkGuiaDeRemision.getGuiaFormulario().setSedeLlegada(new Sede());
        bkGuiaDeRemision.getGuiaFormulario().setDetalleGuiaRemisions(new ArrayList<DetalleGuiaRemision>());
        // Luego usare el proveedor lo cargo perezosamente antes que se cierre la conexion
        Hibernate.initialize(bkGuiaDeRemision.getGuiaFormulario().getIdOrdenCompraServicio().getIdProveedor());
    }

    @Override
    public String nuevo() {
        String URL = super.nuevo();
        if (URL.equals("OK")) {
            try {
                //mbCompAddArticuloStock.addObserver(this);
                URL = URLPaginacion.GuiasDeRemision.URL_FORMULARIO_GUIA_REMISION_OUT;
                GuiaRemision guiaRemision = bkGuiaDeRemision.getGuiaFormulario();
                TipoDocumento tipoDocumento = new TipoDocumento();
                tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_GUIA_REMISION);

                CorrelativoDocumento correlativo = new CorrelativoDocumento();
                correlativo.setIdsede(session.getSede());
                correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
                bkGuiaDeRemisionOUT.setListaCorrelativos(servicioCorrelativo.listarCorrelativoPorDocumentoYSede(correlativo));


                bkGuiaDeRemision.setNumeroGuiaFormulario(
                        bkGuiaDeRemision.getGuiaFormulario().getSerie() + "-"
                        + bkGuiaDeRemision.getGuiaFormulario().getNumeroGuia());
                guiaRemision.setParametroTipoGuia(servicioParametroDetalle.conseguirParametroDetallePorId(Constantes.TipoGuiaRemision.GUIA_SALIDA));
                System.out.println("parametro 1: "+guiaRemision.getParametroTipoGuia().getValCadena());
                guiaRemision.setEstaEntregado((short) 0);
                
                bkGuiaDeRemision.setListaTipoMotivoGuia(new ArrayList<ParametroDetalle>());
                
                for(ParametroDetalle parametro:servicioParametro.listaTipoMotivoGuia()){
                    for(Motivo motivo:servicioMotivo.buscarMotivosPorGrupo(guiaRemision.getParametroTipoGuia().getDesParametroDet())){
                        if(motivo.getDeMotivo().equalsIgnoreCase(parametro.getValCadena())){
                           bkGuiaDeRemision.getListaTipoMotivoGuia().add(parametro); 
                        }
                    }
                    
                }
                
            } catch (ServiceException e) {
                mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
                logger.error(e.getMessage(), e);
                return URLPaginacion.GuiasDeRemision.URL_LISTA_GUIA_REMISION;
            }
        }
        return URL;
    }

    public void buscarNumDoc() {
        for (CorrelativoDocumento correlativo : bkGuiaDeRemisionOUT.getListaCorrelativos()) {
            if (correlativo.getSerie().equalsIgnoreCase(bkGuiaDeRemision.getGuiaFormulario().getSerie())) {
                bkGuiaDeRemision.getGuiaFormulario().setNumeroGuia(correlativo.getNumero());
            }
        }
    }

    @Override
    public String actualizar() {
        String URL = super.actualizar();
        return URL.equals("NOOK") ? URLPaginacion.GuiasDeRemision.URL_FORMULARIO_GUIA_REMISION_OUT : URL;
    }

    @Override
    public String editar() {
        String URL = super.editar();
        //mbCompAddArticuloStock.addObserver(this);
        return URL.equals("OK") ? URLPaginacion.GuiasDeRemision.URL_FORMULARIO_GUIA_REMISION_OUT : URL;
    }

    @Override
    public String guardar() {
        System.out.println("punto de partida: "+bkGuiaDeRemision.getGuiaFormulario().getSedePartida());
        System.out.println("punto de llegada: "+bkGuiaDeRemision.getGuiaFormulario().getSedeLlegada());
        if (bkGuiaDeRemision.getGuiaFormulario().getSedePartida() == null || bkGuiaDeRemision.getGuiaFormulario().getSedePartida().getId() == null) {
            mostrarError("Elija el Punto de Partida.");
            return URLPaginacion.GuiasDeRemision.URL_FORMULARIO_GUIA_REMISION_OUT;
        } else if (bkGuiaDeRemision.getGuiaFormulario().getSedeLlegada() == null || bkGuiaDeRemision.getGuiaFormulario().getSedeLlegada().getId() == null) {
            mostrarError("Elija el Punto de Llegada.");
            return URLPaginacion.GuiasDeRemision.URL_FORMULARIO_GUIA_REMISION_OUT;
        } else {
            boolean flag = generarCodigo();
            if (!flag) {
                String URL = super.guardar();
                return URL.equals("NOOK") ? URLPaginacion.GuiasDeRemision.URL_FORMULARIO_GUIA_REMISION_OUT : URL;
            } else {
                mostrarError("El número de Guía ya ha sido registrado.");
                return URLPaginacion.GuiasDeRemision.URL_FORMULARIO_GUIA_REMISION_OUT;
            }

        }


    }

    public boolean generarCodigo() {

        boolean flag = true;
        try {

            flag = servicioGuia.esNumeroGuiaCorrecta(bkGuiaDeRemision.getGuiaFormulario());
            if (!flag) {
                CorrelativoDocumento correlativo = new CorrelativoDocumento();
                //correlativo.setAnio(UtilitarioFecha.obtenerAnioActual());
                TipoDocumento tipoDocumento = new TipoDocumento();
                tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_GUIA_REMISION);

                Integer numero = Integer.parseInt(bkGuiaDeRemision.getGuiaFormulario().getNumeroGuia()) + 1;
                //System.out.println("numero 2: " + numero);

                correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
                //correlativo.setIdsede(servicioSede.conseguirSedePorId(1));
                correlativo.setIdsede(session.getSede());
                correlativo.setSerie(bkGuiaDeRemision.getGuiaFormulario().getSerie());
                CorrelativoDocumento correlativoEncontrado = servicioCorrelativo.obtenerCorrelativoTipoDocSede1(correlativo);

                if (numero > Integer.parseInt(correlativoEncontrado.getNumero())) {
                    correlativoEncontrado.setNumero(UtilitarioCadenas.formatoNumeroDocumento(numero));
                    servicioCorrelativo.actualizarCorrelativoDocumento(correlativoEncontrado);
                }


            }


        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
        return flag;

    }

    /*@Override
     public void actualizarObservador(Object object) {
     if (object instanceof Object[]) {
     try {
     ArticuloSede[] articuloSedes = (ArticuloSede[]) object;
     List<DetalleGuiaRemision> listaDetGuia = new ArrayList<DetalleGuiaRemision>();
     GuiaRemision guiaRemision = bkGuiaDeRemisionOUT.getGuiaFormulario();

     // Cual es el tipo de unidad minima ? unidad Minima de donde salen?
     //TipoUnidadMinima undMin = servicioTipoUnidadMinima.conseguirTipoUnidadMinimaPorId(1);
     for (ArticuloSede articuloSede : articuloSedes) {
     articuloSede = servicioArticuloSede.buscarArticuloSede(articuloSede);
     DetalleGuiaRemision detaGuiaRemision = addDetalleGuiaDeRemision(guiaRemision, null,
     articuloSede.getArticulo(), articuloSede.getCaStockDisponible(),
     articuloSede.getUnidadMedida(), articuloSede.getUnidadMedida().getAbrev(), articuloSede.getPartidaLote());
     listaDetGuia.add(detaGuiaRemision);
     }
     bkGuiaDeRemisionOUT.getGuiaFormulario().getDetalleGuiaRemisions().clear();
     bkGuiaDeRemisionOUT.getGuiaFormulario().getDetalleGuiaRemisions().addAll(listaDetGuia);
     } catch (Exception e) {
     mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
     logger.error(e.getMessage(), e);
     }
     } else {
     super.actualizarObservador(object);
     }
     }
     */
    @Override
    public String ver() {
        String URL = super.ver();
        return URL.equals("OK") ? URLPaginacion.GuiasDeRemision.URL_VER_GUIA_REMISION_OUT : URL;
    }
}
